home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / Caml Light 0.61 / Source / src / lib / lexing.ml < prev    next >
Encoding:
Text File  |  1993-09-24  |  1.9 KB  |  76 lines  |  [TEXT/MPS ]

  1. (* The run-time library for lexers generated by mllex *)
  2.  
  3. #open "fstring";;
  4. #open "int";;
  5. #open "exc";;
  6. #open "io";;
  7. #open "obj";;
  8. #open "ref";;
  9.  
  10. let lex_aux_buffer =
  11.   create_string 1024
  12. ;;
  13.  
  14. let lex_refill read_fun lexbuf =
  15.   let read =
  16.     read_fun lex_aux_buffer 1024 in
  17.   let n =
  18.     if read > 0 then read else (set_nth_char lex_aux_buffer 0 `\000`; 1) in
  19.   blit_string lexbuf.lex_buffer n lexbuf.lex_buffer 0 (2048 - n);
  20.   blit_string lex_aux_buffer 0 lexbuf.lex_buffer (2048 - n) n;
  21.   lexbuf.lex_abs_pos <- lexbuf.lex_abs_pos + n;
  22.   lexbuf.lex_curr_pos <- lexbuf.lex_curr_pos - n;
  23.   lexbuf.lex_start_pos <- lexbuf.lex_start_pos - n;
  24.   lexbuf.lex_last_pos <- lexbuf.lex_last_pos - n;
  25.   if lexbuf.lex_start_pos < 0 then failwith "lexing: token too long"
  26. ;;  
  27.  
  28.  
  29. let dummy_action x = failwith "lexing: empty token";;
  30.  
  31. let create_lexer f =
  32.   { refill_buff = lex_refill f;
  33.     lex_buffer = create_string 2048;
  34.     lex_abs_pos = - 2048;
  35.     lex_start_pos = 2048;
  36.     lex_curr_pos = 2048;
  37.     lex_last_pos = 2048;
  38.     lex_last_action = dummy_action }
  39. ;;
  40.  
  41. let create_lexer_channel ic =
  42.   create_lexer (fun buf n -> input ic buf 0 n)
  43. ;;
  44.  
  45. let create_lexer_string s =
  46.   { refill_buff =
  47.       (fun lexbuf -> lexbuf.lex_curr_pos <- lexbuf.lex_curr_pos - 1);
  48.     lex_buffer = s ^ "\000";
  49.     lex_abs_pos = 0;
  50.     lex_start_pos = 0;
  51.     lex_curr_pos = 0;
  52.     lex_last_pos = 0;
  53.     lex_last_action = dummy_action }
  54. ;;
  55.  
  56. let get_lexeme lexbuf =
  57.   let len = lexbuf.lex_curr_pos - lexbuf.lex_start_pos in
  58.   let s = create_string len in
  59.     blit_string lexbuf.lex_buffer lexbuf.lex_start_pos s 0 len; s
  60. ;;
  61.  
  62. let get_lexeme_char lexbuf i =
  63.   nth_char lexbuf.lex_buffer (lexbuf.lex_start_pos + i)
  64. ;;
  65.  
  66. let backtrack lexbuf =
  67.   lexbuf.lex_curr_pos <- lexbuf.lex_last_pos;
  68.   magic_obj(lexbuf.lex_last_action lexbuf)
  69. ;;
  70.  
  71. let get_lexeme_start lexbuf =
  72.   lexbuf.lex_abs_pos + lexbuf.lex_start_pos
  73. and get_lexeme_end lexbuf =
  74.   lexbuf.lex_abs_pos + lexbuf.lex_curr_pos
  75. ;;
  76.